import logging
import os
from logging.handlers import TimedRotatingFileHandler


# 日志配置
def setup_logging():
    logger = logging.getLogger()
    logger.setLevel(logging.ERROR)  # 设置全局日志级别为 ERROR

    # 获取当前脚本所在目录
    base_dir = os.path.dirname(os.path.abspath(__file__))

    # 构建相对日志路径
    log_dir = os.path.join(base_dir, 'logs')

    # 确保目录存在
    if not os.path.exists(log_dir):
        os.makedirs(log_dir)

    # 清除所有现有的处理器（避免重复日志）
    for handler in logger.handlers[:]:
        logger.removeHandler(handler)

    # 1. 控制台日志处理器（输出到终端）
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.INFO)  # 控制台只显示 ERROR 及以上级别
    console_formatter = logging.Formatter(
        '%(asctime)s - %(levelname)s - %(message)s'
    )
    console_handler.setFormatter(console_formatter)
    logger.addHandler(console_handler)

    # 使用相对路径配置日志处理器
    err_file = os.path.join(log_dir, 'error.log')
    # 2. 错误日志文件处理器（按天轮转）
    error_handler = TimedRotatingFileHandler(
        err_file,
        when='midnight',
        backupCount=10,
        encoding='utf-8'
    )
    error_handler.setLevel(logging.ERROR)
    error_formatter = logging.Formatter(
        '%(asctime)s - %(levelname)s - %(message)s - [%(filename)s:%(lineno)d]'
    )
    error_handler.setFormatter(error_formatter)
    logger.addHandler(error_handler)

    # 使用相对路径配置日志处理器
    log_file = os.path.join(log_dir, 'app.log')

    # 3. 警告日志文件处理器（按天轮转）
    warning_handler = TimedRotatingFileHandler(
        log_file,
        when='midnight',
        backupCount=5,
        encoding='utf-8'
    )
    warning_handler.setLevel(logging.INFO)
    warning_handler.setFormatter(error_formatter)  # 使用相同的格式
    logger.addHandler(warning_handler)

    # 4. 请求日志文件处理器（按天轮转）
    request_file = os.path.join(log_dir, 'web.log')
    request_handler = TimedRotatingFileHandler(
        request_file,
        when='midnight',
        backupCount=30,  # 保留30天的请求日志
        encoding='utf-8'
    )
    request_handler.setLevel(logging.INFO)
    # 请求日志格式包含更多信息：时间、客户端IP、请求路径、状态码
    request_formatter = logging.Formatter(
        ' ( %(client_ip)s ) - %(asctime)s - %(method)s %(path)s -用户编号：%(user_id)s \n '
        '- 传入参数: %(query_params)s \n - 请求体: %(request_body)s - %(message)s \n - 返回参数: %(response_body)s'
    )
    request_handler.setFormatter(request_formatter)

    # 创建专门的请求日志记录器
    request_logger = logging.getLogger('api')
    request_logger.addHandler(request_handler)
    request_logger.setLevel(logging.INFO)
    request_logger.propagate = False  # 避免日志传播到根记录器

    # 4. 请求日志文件处理器（按天轮转）
    api_file = os.path.join(log_dir, 'api.log')
    api_handler = TimedRotatingFileHandler(
        api_file,
        when='midnight',
        backupCount=30,  # 保留30天的请求日志
        encoding='utf-8'
    )
    api_handler.setLevel(logging.INFO)
    # 请求日志格式包含更多信息：时间、客户端IP、请求路径、状态码
    api_formatter = logging.Formatter(
        ' ( %(client_ip)s ) - %(asctime)s -用户编号：%(user_id)s -执行 %(method)s %(path)s \n '
        '- 传入参数: %(query_params)s \n - 请求体: %(request_body)s - %(message)s \n - 返回参数: %(response_body)s'
    )
    api_handler.setFormatter(api_formatter)

    # 创建专门的请求日志记录器
    api_logger = logging.getLogger('request')
    api_logger.addHandler(api_handler)
    api_logger.setLevel(logging.INFO)
    api_logger.propagate = False  # 避免日志传播到根记录器
